package com.easypay;

import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import com.easypay.util.HttpConnectUtils;
import com.easypay.util.RandomUtil;
import com.easypay.util.StringUtils;
import lombok.Data;

import java.io.File;
import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.*;

/**
 *  商户管理相关接口
 *
 * @date: 2021/10/25 16:50
 * @author: pandans
 */
@Data
public class Merchant {

    public static void main(String[] args) {
        // doUploadPic();


        // 商户信息录入
//        applyMerchant();



        // 商户异步通知回调
        //merchantNotify();


//        addPriLedger();

//        addCompanyPartner();


        changePartner();

        partnerSearch();
    }


//    public static final String CLIENTCODE = "D01X66666666735"; /** 机构号 -- 联调支持分配 */
//    public static String AGENT_SIGN_KEY = "sa72ivadl84273dlj2kdaia2idiadik5";


    public static final String CLIENTCODE = "50310202"; /** 机构号 -- 联调支持分配 */
    public static String AGENT_SIGN_KEY = "EDferdssserrtXDe";  /** 签名秘钥 -- 联调支持分配, 使用getSign接口更新 */


    /**
     * 接口测试地址 -- 联条支持提供
     */
    public static final String BASE_URL = "https://180.168.215.67:4443/AG_MerchantManagementSystem_Core/agent/api/gen";
    public static final String IMAGE_UPLOAD_URL = "https://180.168.215.67:4443/AG_MerchantManagementSystem_Core/agent/api/imgUpl";

    /**
     * 此处是先将图片上传到服务器 得到fileId 后续进件使用
     */
    public static void doUploadPic() {
        Map<String, String> request = new HashMap<>(2);
        request.put("version", "1.0");
        request.put("clientCode", CLIENTCODE);
        //图片类型
        //属性：AN 2
        //描述：01 - 法人身份证正面 ；02-法人身份证反面；03-商户联系人身份证正面；04-商户联系人身份证反面；05-营业执照；06-收银台；07-内部环境照；08-营业场所门头照；09-门牌号；10-协议；11-商户信息调查表正面；12-商户信息调查表反面；13-开户许可证；14-银行卡；15-清算授权书；16-定位照（选填）；17-手持身份证照片（选填）
        //示例：
        //说明：商户所需上传的图片与商户类型（merMode）有关：
        //merMode为企业（0）或者个体户（1）时，需要传：01 - 法人身份证正面 ；02-法人身份证反面；03-商户联系人身份证正面；04-商户联系人身份证反面；05-营业执照；06-收银台；07-内部环境照；08-营业场所门头照；09-门牌号；10-协议；11-商户信息调查表正面；12-商户信息调查表反面；
        //merMode为个人（2）时，需要传：01 - 法人身份证正面 ；02-法人身份证反面；03-商户联系人身份证正面；04-商户联系人身份证反面；06-收银台；07-内部环境照；08-营业场所门头照；09-门牌号；10-协议；11-商户信息调查表正面；12-商户信息调查表反面；
        //收款银行为对公时，需要传：13-开户许可证
        //收款银行为对私时，需要传：14-银行卡；15-清算授权书
        //linkmanType为外国公民护照(1)时需传: 身份证正面处上传护照正面图片,法人身份证反面处传护照详情页图片
        //linkmanType为港澳居民来往大陆通行证或其他有效旅游证件(2)、其他类个人身份有效证件(3)、单位证件（4）、军人或武警身份证件（5）时需传：身份证正面处上传其他身份证件正面图片,法人身份证反面处上传其他身份证件反面图片
        //0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件

        request.put("picMode", "01");
        // 此处计算使用的是渠道密钥！！其他交易使用该接口获取的签名密钥
        calSignAndPut(request, AGENT_SIGN_KEY);

        Map<String, File> fileMap = new HashMap<>();
//        fileMap.put("fileName", new File("C:\\Users\\PanPan\\Pictures\\logo.png"));
        fileMap.put("fileName", new File("/Users/pandans/Downloads/11.png"));

        Map<String, Object> uploadMap = new HashMap<>(2);
        uploadMap.put("form", request);
        uploadMap.put("file", fileMap);
        String response = doRequestUpload("https://180.168.215.67:4443/AG_MerchantManagementSystem_Core/agent/api/imgUpl", uploadMap);
        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     * 商户信息录入
     * 代理商调用该接口报备商户信息；
     */
    public static void applyMerchant() {
        Map<String, String> request = new HashMap<>(2);
        request.put("version", "1.0");
        request.put("messageType", "AGMERAPPLY");
        request.put("clientCode", CLIENTCODE);
        // 商户信息
        JSONObject merInfoJson = getMerInfo();
        request.put("merInfo", merInfoJson.toJSONString());
        request.put("backUrl", "https://zmss.apnpay.com/receiverapi/receviver/customer/notice");
        // 附加信息
        JSONObject plusInfoJson = getPlusInfo();
        request.put("plusInfo", plusInfoJson.toJSONString());
        // licInfo 营业执照信息
        JSONObject licInfoJson = getLicInfo(merInfoJson);
        request.put("licInfo", licInfoJson.toJSONString());
        // accInfo 结算账户信息
        JSONObject accInfoJson = getAccInfo();
        request.put("accInfo", accInfoJson.toJSONString());
        // 商户类型
        String merMode = merInfoJson.getString("merMode");
        // 对私账户
        String accType = accInfoJson.getString("accType");
        // accInfoBak 结算账z户信息2 当商户类型（merMode）为企业商户并且结算账户为对私账户时，该字段必传
        if("0".equals(merMode) && "00".equals(accType)){
            JSONObject accInfoBakJson = getAccInfoBak();
            request.put("accInfoBak", accInfoBakJson.toJSONString());
        }
        // funcInfo 功能信息  unionpayCard
        JSONArray jsonArray = new JSONArray();
        jsonArray.add(getAlipay("2","0.36"));
        jsonArray.add(getWeChat("3","0.36"));
        jsonArray.add(getRealTimeBooked("25","1","0","0.00","1","0.00"));
        jsonArray.add(getUnionpayQRCode("12","1","0.55","30","0","0.36","0"));
        jsonArray.add(getUnionpayQRCode("14","0","0.36","30","0","0.36","0"));
        request.put("funcInfo", jsonArray.toJSONString());
        JSONObject fucnInfoJSON = null;
        String funcId = "";
        for(int i= 0;i<jsonArray.size();i++){
            fucnInfoJSON = jsonArray.getJSONObject(i);
            funcId = fucnInfoJSON.getString("funcId");
        }
        // 开通银行卡收单功能必传
        String bankId = "23";
        if(!"".equals(funcId) && "bankId".equals(funcId)){
            // sysInfo 终端信息
            String sysInfo = getSysInfo();
            request.put("sysInfo", sysInfo);
        }
        // picInfoList 图片信息
        JSONArray picInfoArray = new JSONArray();
        picInfoArray.add(getPicJson("01","6262545d3e10af41558b661a"));
        picInfoArray.add(getPicJson("02","61bfe0613e10af4ed7e6f38f"));
        picInfoArray.add(getPicJson("03","61bfe0633e10af4ed7e6f390"));
        request.put("picInfoList", picInfoArray.toJSONString());
        // + CLIENTCODE.substring(CLIENTCODE.length() - 4)
        request.put("operaTrace", CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
        // 成功可获得 商户唯一标识merTrace
    }

    /**
     * 商户信息补件
     * 当商户信息被驳回或审核失败时，代理商可发起补件请求；
     * 注：代理商将原商户唯一标识（merTrace）上送，易生会回一个新的商户唯一标识；
     */
    public static void addMerchantInfo() {
        Map<String, String> request = new HashMap<>(2);
        request.put("version", "1.0");
        request.put("messageType", "AGENTPATCH");
        request.put("clientCode", CLIENTCODE);
        // 商户信息
        JSONObject merInfoJson = getMerInfo();
        request.put("merInfo", merInfoJson.toJSONString());
        request.put("backUrl", "https://zmss.apnpay.com/receiverapi/receviver/customer/notice");
        // plusInfo 附加信息
        JSONObject plusInfoJson = getPlusInfo();
        request.put("plusInfo", plusInfoJson.toJSONString());
        // licInfo 营业执照信息
        JSONObject licInfoJson = getLicInfo(merInfoJson);
        request.put("licInfo", licInfoJson.toJSONString());
        // accInfo 结算账户信息
        JSONObject accInfoJson = getAccInfo();
        request.put("accInfo", accInfoJson.toJSONString());
        // accInfoBak 结算账户信息2 当商户类型（merMode）为企业商户并且结算账户为对私账户时，该字段必传
        JSONObject accInfoBakJson = new JSONObject();
        // 商户类型
        String merMode = merInfoJson.getString("merMode");
        // 对私账户
        String accType = accInfoJson.getString("accType");
        if("0".equals(merMode) && "00".equals(accType)){
            request.put("accInfoBak", accInfoBakJson.toJSONString());
        }
        // funcInfo 功能信息
        JSONObject funcInfoJson = new JSONObject();
        JSONArray jsonArray = new JSONArray();
        jsonArray.add(getAlipay("2","0.36"));
        jsonArray.add(getWeChat("3","0.36"));
        jsonArray.add(getRealTimeBooked("25","1","0","0.00","1","0.00"));
        jsonArray.add(getUnionpayQRCode("12","1","0.55","30","0","0.36","0"));
        jsonArray.add(getUnionpayQRCode("14","0","0.36","30","0","0.36","0"));
        request.put("funcInfo", jsonArray.toJSONString());
        jsonArray.add(getUnionpayQRCode("12","1","0.55","30","0","0.36","0"));
        jsonArray.add(getUnionpayQRCode("14","0","0.36","30","0","0.36","0"));
        request.put("funcInfo", jsonArray.toJSONString());
        JSONObject fucnInfoJSON = null;
        String funcId = "";
        for(int i= 0;i<jsonArray.size();i++){
            fucnInfoJSON = jsonArray.getJSONObject(i);
            funcId = fucnInfoJSON.getString("funcId");
        }
        // 开通银行卡收单功能必传
        String bankId = "23";
        if(!"".equals(funcId) && "bankId".equals(funcId)){
            // sysInfo 终端信息
            String sysInfo = getSysInfo();
            request.put("sysInfo", sysInfo);
        }
        // picInfoList 图片信息
        JSONObject picInfoListJson = new JSONObject();
        JSONArray picInfoArray = new JSONArray();
        picInfoArray.add(getPicJson("01","61bfe0f01faf202cd074a51f"));
        picInfoArray.add(getPicJson("02","61bfe0f11faf202cd074a521"));
        picInfoArray.add(getPicJson("03","61bfe0f21faf202cd074a522"));
        request.put("picInfoList", picInfoArray.toJSONString());

        request.put("operaTrace", CLIENTCODE.substring(0, 4) + CLIENTCODE.substring(CLIENTCODE.length() - 4) + StringUtils.getLocalDate() + RandomUtil.generateNumString(6));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
        // 成功可获得 商户唯一标识merTrace
    }

    /**
     * 商户异步通知回调
     * 所有异步接口，包括商户入件、补件、变更、终端新增、变更等，都可通过该接口获取商户处理结果；
     * 该接口会回一些主要的字段：funcInfo信息是所有的功能字段；sysInfo:包括内部商户号（merCode）,终端名称（username）,终端商户号（termMercode）,终端终端号（termTermcode）,渠道商户号（bangdingcommercode）,渠道终端号（bangdingtermno）
     */
    public static void merchantNotify() {
        Map<String, String> request = new HashMap<>(16);
        // 版本号
        request.put("version", "1.0");
        // 机构号
        request.put("clientCode",CLIENTCODE);
        // 回调地址
        request.put("backUrl","https://zmss.apnpay.com/receiverapi/receviver/customer/notice");
        // 操作流水
        request.put("operaTrace",CLIENTCODE.substring(0, 4)  + StringUtils.getLocalDate() + RandomUtil.generateNumString(2));

        calSignAndPut(request, AGENT_SIGN_KEY);
        String response = doRequest(request);
        checkSign(response, AGENT_SIGN_KEY);
        // 成功可获得 商户唯一标识merTrace
    }

    // ///////////////////////////////////////--分账收款相关接口--/////////////////////////////////////// //
    /**
     * 添加分账接收方 https://doc.eycard.cn/web/#/23?page_id=4817
     *
     */
    public static void addPriLedger() {
        Map<String, String> request = new HashMap<>(2);
        request.put("version", "1.0");
        request.put("clientCode", CLIENTCODE);
        // 账号姓名 长度100
        request.put("accName", "----");
        // 账号证件有效期 证件有效期 格式：[“起始日期”,”截止日期”],JSON格式字符串
        JSONArray cfValidArray = new JSONArray();
        cfValidArray.add("20180604");
        cfValidArray.add("20380604");
        request.put("cfValidity", cfValidArray.toJSONString());
        // 账号证件类型 证件类型：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件
        request.put("cfType", "0");
        // 账号证件号
        request.put("cfNo", "---");
        // 银行卡开户行 长度100
        request.put("bankName", "中国建设银行");
        // 银行卡银行账号
        request.put("accNo", "----");
        // 银行卡手机号
        request.put("phoneNo", "----");
        // 账号类型 00-个人；10-对公
        request.put("accType", "00");
        // 开户行行号
        request.put("bankCode", "105290077005");
        // 图片信息， json数字格式 [{“picMode”: “01 “,”fileid”: “22222”}，{“picMode”: “02”,”fileid”: “22222323”}] picMode，fileid参考图片上传
        JSONArray picArray = new JSONArray();
        // fileid 根据 doUploadPic  上传图片后获取
        picArray.add(getPicJson("01", "620225403e10af5f6a956cc9"));
        picArray.add(getPicJson("02", "620225403e10af5f6a956cc9"));
        picArray.add(getPicJson("03", "620225403e10af5f6a956cc9"));
        request.put("picInfo", picArray.toJSONString());
        calSignAndPut(request, AGENT_SIGN_KEY);
//        Map<String, File> fileMap = new HashMap<>();
//        fileMap.put("fileName", new File("C:\\Users\\kongr\\Downloads\\1113.png"));
//        fileMap.put("fileName2", new File("C:\\Users\\kongr\\Downloads\\1113.png"));
//
//
        Map<String, Object> realReq = new HashMap<>();
        realReq.put("form", request);
//        realReq.put("file", fileMap);

        String response = doRequestUpload("https://mtest.eycard.cn:4443/AG_MerchantManagementSystem_Core/jzt/api/pri",realReq);
//        String response = doRequestUpload("http://192.168.5.220:11000/HeNan_MerchantManagementSystem_Core/jzt/api/pri",realReq);


        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     * 添加分账接收方 https://doc.eycard.cn/web/#/23?page_id=4818
     * {"merCode":"K31000012989512","bankCode":"308100005035","picInfo":"[{\"picMode\":\"01\",\"fileid\":\"620225403e10af5f6a956cc9\"},{\"picMode\":\"02\",\"fileid\":\"620225403e10af5f6a956cc9\"},{\"picMode\":\"03\",\"fileid\":\"620225403e10af5f6a956cc9\"}]","businLic":"91110108717743469K","accNo":"6180196910001","accName":"百度在线网络技术（北京）有限公司","bankName":"招商银行","retCode":"0000","retMsg":"操作成功","version":"1.0","MAC":"70A6A98B15C3D304E5F57C3F3EB93671","clientCode":"50310202","businName":"百度在线网络技术（北京）有限公司","accType":"10","termCode":"W1490280"}
     */
    public static void addCompanyPartner() {
        Map<String, String> request = new HashMap<>(2);
        request.put("version", "1.0");
        request.put("clientCode", CLIENTCODE);
        // 银行卡开户行 长度100
        request.put("bankName", "招商银行");
        // 账号类型 00-个人；10-对公
        request.put("accType", "10");
        // 开户行行号
        request.put("bankCode", "308100005035");
        // 银行卡银行账号
        request.put("accNo", "6180196910001");
        // 银行账户名称
        request.put("accName", "百度在线网络技术（北京）有限公司");
        // 营业执照号
        request.put("businLic", "91110108717743469K");
        // 注册名称
        request.put("businName", "百度在线网络技术（北京）有限公司");

        // 图片信息， json数字格式 [{“picMode”: “01 “,”fileid”: “22222”}，{“picMode”: “02”,”fileid”: “22222323”}] picMode，fileid参考图片上传
        JSONArray picArray = new JSONArray();
        // fileid 根据 doUploadPic  上传图片后获取
        picArray.add(getPicJson("01", "620225403e10af5f6a956cc9"));
        picArray.add(getPicJson("02", "620225403e10af5f6a956cc9"));
        picArray.add(getPicJson("03", "620225403e10af5f6a956cc9"));
        request.put("picInfo", picArray.toJSONString());
        calSignAndPut(request, AGENT_SIGN_KEY);
//        Map<String, File> fileMap = new HashMap<>();
//        fileMap.put("fileName", new File("C:\\Users\\kongr\\Downloads\\1113.png"));
//        fileMap.put("fileName2", new File("C:\\Users\\kongr\\Downloads\\1113.png"));
//
//
        Map<String, Object> realReq = new HashMap<>();
        realReq.put("form", request);
//        realReq.put("file", fileMap);

        String response = doRequestUpload("https://mtest.eycard.cn:4443/AG_MerchantManagementSystem_Core/jzt/api/ent",realReq);


        checkSign(response, AGENT_SIGN_KEY);
    }

    /**
     * https://doc.eycard.cn/web/#/23?page_id=4819
     * 收款方变更
     */
    public static void changePartner() {
        Map<String, String> request = new HashMap<>(2);
        request.put("version", "1.0");
        request.put("clientCode", CLIENTCODE);
        // 手机号， 默认0 -- 会报格式错误
        request.put("phoneNo", "");
        // 账号证件有效期 证件有效期 格式：[“起始日期”,”截止日期”],JSON格式字符串
        JSONArray cfValidArray = new JSONArray();
        cfValidArray.add("20180604");
        cfValidArray.add("20380604");
        request.put("cfValidity", cfValidArray.toJSONString());

        // 银行卡开户行 长度100
        request.put("bankName", "招商银行");
        // 银行卡银行账号
        request.put("accNo", "6180196910001");
        // 银行账户名称
        request.put("accName", "百度在线网络技术（北京）有限公司");
        // 易生商户号
        request.put("merCode", "K31000012989512");
        // 易生终端号
        request.put("termCode", "W1490280");
        // 操作类型 UPDATE-变更，DELETE-注销
        request.put("txnType", "UPDATE");

        calSignAndPut(request, AGENT_SIGN_KEY);

        Map<String, Object> realReq = new HashMap<>();
        realReq.put("form", request);
//        realReq.put("file", fileMap);

        String response = doRequestUpload("https://mtest.eycard.cn:4443/AG_MerchantManagementSystem_Core/jzt/api/upd",realReq);


        checkSign(response, AGENT_SIGN_KEY);
    }


    /**
     * https://doc.eycard.cn/web/#/23?page_id=4820
     * 分账查询
     */
    public static void partnerSearch() {
        Map<String, String> request = new HashMap<>(2);
        request.put("version", "1.0");
        request.put("clientCode", CLIENTCODE);
        // 易生商户号
        request.put("merCode", "K31000012989512");
        // 易生终端号
        request.put("termCode", "W1490280");

        calSignAndPut(request, AGENT_SIGN_KEY);

        Map<String, Object> realReq = new HashMap<>();
        realReq.put("form", request);
//        realReq.put("file", fileMap);

        String response = doRequestUpload("https://mtest.eycard.cn:4443/AG_MerchantManagementSystem_Core/jzt/api/sel",realReq);


        checkSign(response, AGENT_SIGN_KEY);
    }

    ///////////////////////////////---分账查询结束---/////////////////////////////////////
    public static JSONObject getPicJson(String mode, String fileid) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("picMode", mode);
        jsonObject.put("fileid", fileid);

        return jsonObject;
    }

    /**
     * @param request: 请求参数, 不包含sign
     * @Description 公用请求串
     * @date: 2021/10/24 11:29
     * @author: pandans
     */
    public static String doRequest(Map<String, String> request) {
        return doRequest(BASE_URL, request);
    }
    public static String doRequest(String url, Map<String, String> request) {
        try {
            String response = HttpConnectUtils.sendHttpSRequest( BASE_URL, request, "POST", null);
            System.out.println("响应报文：" + response);
            return response;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    public static String doRequestUpload(Map<String, Object> request) {
        return doRequestUpload(BASE_URL, request);
    }
    public static String doRequestUpload(String url, Map<String, Object> request) {
        try {
            String response = HttpConnectUtils.sendHttpSRequest( url, request, "MULTIPART", null);
            System.out.println("\n====> " + response);
            return response;

        } catch (IOException e) {
            e.printStackTrace();
        }
        return "";
    }

    /**
     * 根据返回的内容计算签名
     * @param response 服务器返回报文
     * @param signKey 签名KEY
     * @return
     */
    public static boolean checkSign(String response, String signKey) {
        Map<String, String> signMap = JSONObject.parseObject(response, Map.class);
        // 报文返回的签名
        String sign = signMap.get("sign");
        if(sign == null) {
            System.err.println("验证签名====》！！！！非成功业务无Sign返回");
            return false;
        }
        // 报文计算的签名
        String calSign = calSign(signMap, signKey);
        boolean res = sign.equals(calSign);
        System.out.println("验证签名====》" + res);
        return res;
    }
    /**
     * 计算sign, 将sign 写入Map中
     * @param request 请求内容不包含sign
     * @param signKey 签名key
     */
    public static void calSignAndPut(Map<String, String> request, String signKey) {
        String md5 = calSign(request, signKey);
        request.put("MAC", md5);
    }
    /**
     * 计算sign
     * @param request 请求内容不包含sign
     * @param signKey 签名key
     */
    public static String calSign(Map<String, String> request, String signKey) {
        Set<String> keySet = request.keySet();
        TreeSet<String> treeSet = new TreeSet<>(keySet);
        StringBuilder stringBuilder = new StringBuilder();
        for(String key : treeSet) {
            if(!"MAC".equals(key) && !StringUtils.isEmpty(request.get(key))) {
                stringBuilder.append(key).append("=").append(request.get(key)).append("&");
            }
        }
        stringBuilder.append("key=").append(signKey);
        String str = stringBuilder.toString();
        System.out.println("待签名字段：====>" + str);
        String md5 = calMD5(str);
        return md5;
    }

    /**
     * MD5 算法
     * @param data 待计算源数据
     * @return md5值
     */
    public static String calMD5(String data) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5");
            md.update(data.getBytes(StandardCharsets.UTF_8));
            return toHexString(md.digest()).toUpperCase();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return null;
    }
    public static final char[] HEX_CHAR = { '0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};
    public static String toHexString(byte[] bytes) {
        char[] buf =  new char[bytes.length * 2];
        int index = 0;
        for(byte b: bytes) {
            buf[index++] = HEX_CHAR[b >>> 4 & 0xf];
            buf[index++] = HEX_CHAR[b & 0xf];
        }
        return new String(buf);
    }

    // 支付宝
    public static JSONObject getAlipay(String funcId, String calcVal) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("funcId",funcId);
        jsonObject.put("calcVal",calcVal);
        return jsonObject;
    }
    // 微信
    public static JSONObject getWeChat(String funcId, String calcVal) {
        JSONObject jsonObject = new JSONObject();
        jsonObject.put("funcId",funcId);
        jsonObject.put("calcVal", calcVal);
        return jsonObject;
    }
    // 实时入账
    public static JSONObject getRealTimeBooked(String funcId, String dCalcType,String tradeType,String dCalcVal,String cCalcType,String cCalcVal) {
        JSONObject jsonObject = new JSONObject();
        // 功能ID:25
        jsonObject.put("funcId",funcId);
        // 借记卡计费类型:0-按笔数（单位：元）;1-按比例（单位：%）
        jsonObject.put("DCalcType", dCalcType);
        // 	交易类型：0-全部；1-银行卡；2-条码支付
        jsonObject.put("tradeType",tradeType);
        // 借记卡扣率
        jsonObject.put("DCalcVal",dCalcVal);
        // 信用卡计费类型:0-按笔数（单位：元）;1-按比例（单位：%）
        jsonObject.put("CCalcType",cCalcType);
        // 信用卡扣率
        jsonObject.put("CCalcVal",cCalcVal);
        return jsonObject;
    }
    // 银联二维码
    public static JSONObject getUnionpayQRCode(String funcId, String dStlmType,String dCalcVal,String dStlmMaxAmt,String dFeeLowLimit,String cCalcVal,String cFeeLowLimit) {
        JSONObject jsonObject = new JSONObject();
        // 功能ID：12
        jsonObject.put("funcId",funcId);
        // 借记卡扣率方式 :1-封顶;0-不封顶
        jsonObject.put("DStlmType", dStlmType);
        // 借记卡扣率（单位：%）
        jsonObject.put("DCalcVal",dCalcVal);
        // 借记卡封顶金额（单位：元）,借记卡扣率方式封顶时必填
        String tlmType = jsonObject.getString("DStlmType");
        if("1".equals(tlmType)){
            jsonObject.put("DStlmMaxAmt",dStlmMaxAmt);
        }
        // 借记卡手续费最低值（单位：元）
        jsonObject.put("DFeeLowLimit",dFeeLowLimit);
        // 信用卡扣率（单位：%）
        jsonObject.put("CCalcVal",cCalcVal);
        // 信用卡手续费最低值（单位：元）
        jsonObject.put("CFeeLowLimit",cFeeLowLimit);
        return jsonObject;
    }
    // 立招
    public static JSONObject getStandFor(String funcId,String termName,String twoBarCode) {
        JSONObject standforData = new JSONObject();
        //功能ID:13
        standforData.put("funcId",funcId);
        // 二维码信息，JSON字符串（LIST）
        standforData.put("twoBars",getTwoBars(twoBarCode,termName));
        return standforData;
    }
    public static String getTwoBars(String twoBarCode,String termName){
        List list = new ArrayList();
        JSONObject json = new JSONObject();
        json.put("twoBarCode",twoBarCode);
        json.put("termName",termName);
        list.add(json);
        return list.toString();
    }

    // 银联营销业务
    public static JSONObject unionpayMarketing(){
        JSONObject unionpayMarketingJSON = new JSONObject();
        unionpayMarketingJSON.put("funcId",14);   //功能ID:14
        unionpayMarketingJSON.put("DStlmType","1");   //借记卡扣率方式 :1-封顶;0-不封顶
        unionpayMarketingJSON.put("DCalcVal","0.35");   //借记卡扣率
        unionpayMarketingJSON.put("DStlmMaxAmt","20");   //借记卡封顶金额
        unionpayMarketingJSON.put("DFeeLowLimit","3.13");   //借记卡手续费最低值
        unionpayMarketingJSON.put("CCalcVal","0.35");   //信用卡扣率
        unionpayMarketingJSON.put("CFeeLowLimit","33.33");   //2	信用卡手续费最低值
        return unionpayMarketingJSON;
    }

    // 银联聚合支付
    public static JSONObject unionpaySmall(){
        JSONObject unionpaySmallData = new JSONObject();
        unionpaySmallData.put("funcId",16);   //功能ID:16
//      unionpaySmallData.put("termMsg",getTermMsg());   //功能ID:16
        unionpaySmallData.put("DStlmType","1");   //借记卡扣率方式 :1-封顶;0-不封顶
        unionpaySmallData.put("DCalcVal","0.1");   //	借记卡扣率
        unionpaySmallData.put("DStlmMaxAmt","20");   //	借记卡封顶金额
        unionpaySmallData.put("DFeeLowLimit","10");   //	借记卡手续费最低值
        unionpaySmallData.put("CCalcVal","5");   //	信用卡扣率
        unionpaySmallData.put("CFeeLowLimit","100");   //	信用卡手续费最低值
        return unionpaySmallData;
    }

    public static String getTermMsg(){
        List list = new ArrayList();
        JSONObject json = new JSONObject();
        json.put("unionPayQRCode","123456789");  //聚合码编号
        json.put("unionPayName","***********");   //二维码名称
        list.add(json);
        return list.toString();
    }

    // 银行卡收单
    public static JSONObject unionpayCard (){
        JSONObject unionpayCardData = new JSONObject();
        unionpayCardData.put("funcId",23);   //功能ID:23
        unionpayCardData.put("DStlmType","1");   //借记卡扣率方式 :1-封顶;0-不封顶
        unionpayCardData.put("DCalcVal","0.5");   //借记卡扣率
        unionpayCardData.put("DStlmMaxAmt","50");   //借记卡封顶金额
        unionpayCardData.put("DFeeLowLimit","0");   //借记卡手续费最低值
        unionpayCardData.put("CCalcVal","0.6");   //信用卡扣率
        unionpayCardData.put("CFeeLowLimit","0");   //信用卡手续费最低值
        return unionpayCardData;
    }

    // D1增值服务费
    public static JSONObject valueAdded (){
        JSONObject unionpayCardData = new JSONObject();
        unionpayCardData.put("funcId",10);   //功能ID:10
        unionpayCardData.put("calcType","1");   //借计算方式 :1-按比例计算(单位：%);0-按笔计算(单位：元)
        unionpayCardData.put("calcVal","0.5");   //	手续费
        unionpayCardData.put("payDateType","0");   //费用处理模式：0-每天计费；1-节假日；2-节假日按天
        return unionpayCardData;
    }

    // 三方分润
    public static JSONObject threeFenRun (){
        JSONObject threeFenRunJSON = new JSONObject();
        // 功能ID：15
        threeFenRunJSON.put("funcId","15");
        // 商户扣率承担方：00-商户；10-第三方
        threeFenRunJSON.put("typeCode","10");
        // 手续费（单位：%）
        threeFenRunJSON.put("calcVal","0.5");
        // 分润方ID
        threeFenRunJSON.put("stlmPartCode","");
        return threeFenRunJSON;
    }
    // 银联无跳转快捷支付
    public static JSONObject unionpayQuickPayment(){
        JSONObject quickPayment = new JSONObject();
        quickPayment.put("funcId",27);   //功能ID:27
        quickPayment.put("DStlmType","1");   //借记卡扣率方式 :1-封顶;0-不封顶
        quickPayment.put("DCalcVal","0.5");   //借记卡扣率
        quickPayment.put("DStlmMaxAmt","50");   //借记卡封顶金额
        quickPayment.put("DFeeLowLimit","0");   //借记卡手续费最低值
        quickPayment.put("CCalcVal","0.6");   //信用卡扣率
        quickPayment.put("CFeeLowLimit","0");   //信用卡手续费最低值
        quickPayment.put("mercode","");  // 银联商户号
        return quickPayment;
    }

    //  结算账户信息方法
    public static JSONObject getAccInfo() {
        JSONObject accInfoJson = new JSONObject();
        // 开户行名称
        accInfoJson.put("bankName","招商银行浦东支行");
        // 开户行行号
        accInfoJson.put("bankCode","621036982589369369");
        // 账号
        accInfoJson.put("account","6217000010144854901");
        // 账户名称
        accInfoJson.put("accName","小张");
        // 账户类型：00-个人；10-对公
        accInfoJson.put("accType","00");
        String accType = accInfoJson.getString("accType");
        if("00".equals(accType)){
            // 证件类型：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件 accType为个人时必填
            accInfoJson.put("legalType","0");
            // 证件号 accType为个人时必填
            accInfoJson.put("legalCode","410225199303126125");
            // 对私手机号 accType为个人时必填
            accInfoJson.put("accPhone","15933210586");
        }
        return accInfoJson;
    }

    // 营业执照信息方法
    public static JSONObject getLicInfo(JSONObject merInfoJson) {
        JSONObject licInfoJson = new JSONObject();
        String merMode = merInfoJson.getString("merMode");
        if("0".equals(merMode) || "1".equals(merMode)){
            // 工商注册号/统一社会信用码（营业执照）,merMode为0,1时，必传
            licInfoJson.put("merLic","");
            // 营业执照有效期 格式：[“起始日期”,”截止日期”],JSON格式字符串 ,merMode为0,1时，必传
            licInfoJson.put("licValidity","[\"2022.04.22\",\"2042.04.22\"]");
        }
        // 主营业务
        licInfoJson.put("businScope","收钱");
        // 注册资本：单位-万元
        licInfoJson.put("capital","10");
        // 注册资本币种:默认-人民币
        licInfoJson.put("capitalCurrency","人民币");
        // 注册地址
        licInfoJson.put("licAddr","上海浦东新区");
        // 控股股东或实际控制人姓名或名称
        licInfoJson.put("controlerName","小张");
        // 控股股东或实际控制人证件号码
        licInfoJson.put("controlerLegalCode","410225199303126125");
        // 控股股东或实际控制人证件种类：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件
        licInfoJson.put("controlerLegalType","0");
        // 控股股东或实际控制人证件有效期
        licInfoJson.put("controlerLegalValidity","[\"2022.04.22\",\"2042.04.22\"]");
        return licInfoJson;
    }

    // 附加信息方法
    public static JSONObject getPlusInfo() {
        // plusInfo 附加信息
        JSONObject plusInfoJson = new JSONObject();
        // 法定代表人姓名
        plusInfoJson.put("merLegal","小张");
        // 证件类型：0-居民身份证或临时身份证;1-外国公民护照;2-港澳居民来往大陆通行证或其他有效旅游证件；3-其他类个人身份有效证件；4-单位证件；5-军人或武警身份证件
        plusInfoJson.put("legalType","0");
        // 法人证件号码
        plusInfoJson.put("legalCode","410225199303126125");
        // 证件有效期 格式：[“起始日期”,”截止日期”],JSON格式字符串,例如：[“2011.01.01”,”2039.01.01”]
        plusInfoJson.put("linkmanValidity","[\"2021.04.25\",\"2041.04.25\"]");
        // 手机号
        plusInfoJson.put("linkmanPhone","15836075482");
        // 商户联系人姓名
        plusInfoJson.put("linkMan","小张");
        // 证件号码
        plusInfoJson.put("linkmanCode","410225199303126125");
        return plusInfoJson;
    }

    // 商户信息方法
    public static JSONObject getMerInfo() {
        JSONObject merInfoJson = new JSONObject();
        // 商户经营类型
        merInfoJson.put("merMode","2");
        // 注册名称
        merInfoJson.put("merName","上海公司");
        // 经营名称 (店名)
        merInfoJson.put("businName","全家便利店");
        // 商户类型（MCC），银联定义的MCC编码
        merInfoJson.put("merType","5331");
        // 行业大类 0-标准、1-优惠、2-减免
        merInfoJson.put("standardFlag","0");
        // 商户区域：银联地区码
        merInfoJson.put("merArea","1023");
        // 注册地址
        merInfoJson.put("merAddr","上海浦东新区");
        // 公司规模:1：0-50人；2：50-100人；3:100以上
        merInfoJson.put("employeeNum","1");
        // 经营形态：02-普通店、01-连锁店
        merInfoJson.put("businForm","01");
        return merInfoJson;
    }
    /**
     *  结算账户信息2
     *  当商户类型为企业商户时，如果accInfo的账户类型为对私，则该字段必传，且账户必须是对公账户；该字段为商户的结算账户信息
     */
    public static JSONObject getAccInfoBak(){
        JSONObject accInfoBak = new JSONObject();
        // 开户行名称
        accInfoBak.put("bankName","招商银行");
        // 开户行行号
        accInfoBak.put("bankCode","621036982589369369");
        // 账号
        accInfoBak.put("account","6217000010144854901");
        // 账户名称
        accInfoBak.put("accName", "百度在线网络技术（北京）有限公司");
        // 账户类型：10-对公
        accInfoBak.put("accType","10");
        return accInfoBak;
    }

    /**
     * 终端信息
     * 该字段为商户的终端信息，JSON格式字符串(list)，可以有多个终端
     * @return
     */
    public static String getSysInfo(){
        List list = new ArrayList();
        JSONObject jsonObject = new JSONObject();
        list.add(getJSONSysInfo());
        list.add(getJSONSysInfo());
        list.add(getJSONSysInfo());
        return list.toString();
    }
    public static JSONObject getJSONSysInfo(){
        JSONObject sysInfoJSON = new JSONObject();
        sysInfoJSON.put("termMode","0");   //终端种类:0-POS终端;4-银联POS；5-其他POS（默认为POS终端）
        sysInfoJSON.put("username","终端名-a");   //终端名称
        sysInfoJSON.put("areaNo","5843");   //区号
//      sysInfoJSON.put("terminalno","");   //电话号码
//      sysInfoJSON.put("termCode","32763570");   //内部终端号,变更时必须上传该字段
        sysInfoJSON.put("termArea","5843");   //终端地区
        sysInfoJSON.put("installaddress","广东省深圳市龙华区凯滨新村81栋一楼家园深圳市桶装水配送中心");   //	终端布放地址
        sysInfoJSON.put("linkMan","联系人---a");   //	联系人
        sysInfoJSON.put("linkPhone","13121178851");   //	联系电话
//      data.put("businessZone","");   //	所属商圈
        sysInfoJSON.put("termModel","235");   //设备型号:该字段通过接口获取
        sysInfoJSON.put("termModelLic","00210101018300820037");   //机具号
//      sysInfoJSON.put("bangdingcommercode","");   //渠道商户号：终端类型为4或者5时，必须上送该字段
//      sysInfoJSON.put("bangdingtermno","");   //渠道终端号：终端类型为4或者5时，必须上送该字段
//      sysInfoJSON.put("simno","");   //无线终端SIM卡
//      sysInfoJSON.put("remark","");   //	备注

        return  sysInfoJSON;
    }


}
